package com.fhao.friend.service.user.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.fhao.common.core.constants.Constants;
import com.fhao.common.core.domain.PageQueryDTO;
import com.fhao.common.core.domain.TableDataInfo;
import com.fhao.common.core.enums.ExamListType;
import com.fhao.common.core.utils.ThreadLocalUtil;
import com.fhao.friend.domain.exam.vo.ExamVO;
import com.fhao.friend.domain.message.vo.MessageTextVO;
import com.fhao.friend.manager.MessageCacheManager;
import com.fhao.friend.mapper.message.MessageTextMapper;
import com.fhao.friend.service.user.IUserMessageService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserMessageServiceImpl implements IUserMessageService {

    @Autowired
    private MessageCacheManager messageCacheManager;

    @Autowired
    private MessageTextMapper messageTextMapper;

    @Override
    public TableDataInfo list(PageQueryDTO pageQueryDTO) {
        Long userId = ThreadLocalUtil.get(Constants.USER_ID, Long.class);
        //从redis当中获取用户消息列表的数据
        //第一次查询可能 redis中没有数据, 先去数据库中查询数据, 并且将数据同步到redis当中.
        Long total = messageCacheManager.getListSize(userId);//获取数据总数
        List<MessageTextVO> messageTextVOSList;
        if(total == null || total <= 0) {
            //从数据库中查询用户消息列表
            PageHelper.startPage(pageQueryDTO.getPageNum(), pageQueryDTO.getPageSize());
            messageTextVOSList = messageTextMapper.selectUserMsgList(userId);
            messageCacheManager.refreshCache(userId);
            // 因为只处理了未完赛的列表, 已完赛的进来直接走数据库,刷新缓存,后面就会一直走redis,但是随着时间的推移竞赛是会过期的.
            //也就是说已完赛列表是动态变化的, 这要如何处理???
            total = new PageInfo<>(messageTextVOSList).getTotal();
        }else {
            //从redis中获取我的消息列表
            messageTextVOSList = messageCacheManager.getMsgTextVOList(pageQueryDTO,userId);
            //redis中获取我的竞赛列表,如果出现异常情况会重新刷新数据,结果可能发生变化,所以需要重新获取listSize
            total = messageCacheManager.getListSize(userId);
        }
        if(CollectionUtil.isEmpty(messageTextVOSList)) { // questionVOS == null || questionVOS.isEmpty()
            return TableDataInfo.empty();
        }
//        new PageInfo<>(list).getTotal(); //获取符合查询条件数据的总数.
//        return TableDataInfo.success(list,list.size());
        return TableDataInfo.success(messageTextVOSList,total);
    }
}









